{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#本章需导入的模块\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import warnings\n",
    "warnings.filterwarnings(action = 'ignore')\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题\n",
    "plt.rcParams['axes.unicode_minus']=False\n",
    "from sklearn.model_selection import train_test_split,KFold,cross_val_score\n",
    "from sklearn import tree\n",
    "import sklearn.linear_model as LM\n",
    "from sklearn import ensemble\n",
    "from sklearn.datasets import make_classification,make_circles,make_regression\n",
    "from sklearn.metrics import zero_one_loss,r2_score,mean_squared_error,accuracy_score\n",
    "import xgboost as xgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X,Y=make_classification(n_samples=12000,n_features=10,n_redundant=0,n_informative=2,random_state=123,n_clusters_per_class=1)\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)\n",
    "dt_stump = tree.DecisionTreeClassifier(max_depth=1, min_samples_leaf=1)\n",
    "dt_stump.fit(X_train, Y_train)\n",
    "dt_stump_err = 1.0 - dt_stump.score(X_test, Y_test)\n",
    "dt = tree.DecisionTreeClassifier(max_depth=9, min_samples_leaf=1)\n",
    "dt.fit(X_train, Y_train)\n",
    "dt_err = 1.0 - dt.score(X_test, Y_test)\n",
    "\n",
    "B=400\n",
    "ada_discrete = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,algorithm=\"SAMME\")\n",
    "ada_discrete.fit(X_train, Y_train)\n",
    "ada_real = ensemble.AdaBoostClassifier(base_estimator=dt_stump,n_estimators=B,algorithm=\"SAMME.R\")\n",
    "ada_real.fit(X_train, Y_train)\n",
    "\n",
    "ada_discrete_err = np.zeros((B,))\n",
    "for i,Y_pred in enumerate(ada_discrete.staged_predict(X_test)):\n",
    "    ada_discrete_err[i] = zero_one_loss(Y_pred, Y_test)\n",
    "ada_real_err = np.zeros((B,))\n",
    "for i, Y_pred in enumerate(ada_real.staged_predict(X_test)):\n",
    "    ada_real_err[i] = zero_one_loss(Y_pred, Y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "说明：利用模拟数据对比单棵决策树、弱模型以及提升策略的预测效果。\n",
    "1、首先make_classification生成样本量等于12000，10个输入变量，输出变量为二分类的数据集。利用旁置法划分训练集和测试集。\n",
    "2、建立树深度等于1的弱模型，计算其测试误差。\n",
    "3、建立树深度等于9的复杂决策树，计算其测试误差。\n",
    "3、计算不断增加迭代次数至400过程中，计算以上述弱模型为基础学习器的提升策略中的SAMME和SAMME.R算法的测试误差。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "axes = fig.add_subplot(111)\n",
    "axes.axhline(y=dt_stump_err,c='red',linewidth=0.8,label='单个弱模型')\n",
    "axes.axhline(y=dt_err,c='blue',linewidth=0.8,label='单棵树深度=9的分类树')\n",
    "axes.plot(np.arange(B), ada_discrete_err,linestyle='--',label='离散AdaBoost')\n",
    "axes.plot(np.arange(B), ada_real_err,linestyle='-.',label='连续AdaBoost')\n",
    "axes.set_xlabel('迭代次数B')\n",
    "axes.set_ylabel('测试误差')\n",
    "axes.set_title('单棵树、弱模型和adaBoost集成树')\n",
    "axes.legend()\n",
    "#leg = axes.legend(loc='upper right', fancybox=True)\n",
    "#leg.get_frame().set_alpha(0.7)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "说明：对上述计算结果绘制折线图。图形显示弱模型的测试误差最高，复杂决策树的测试误差最低，但随迭代次数的增加，提升策略的测试误差不仅可以降复杂模型的水平，而且还会更低。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
